from django.http import HttpResponseNotFound
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.shortcuts import redirect
from django.core.exceptions import ObjectDoesNotExist
from Proyectos.forms import ProyectoForm, LinkForm, ProyectoLinksOnlyForm, DocumentoForm, ProyectoDocsOnlyForm
from Proyectos.models import Proyecto, Link, Documento
from django.contrib.auth.decorators import login_required
from Grupos.models import Grupo

def tienePermProyecto(user, proyecto):
	if user and proyecto:
		if proyecto.creador.id == user.id:
			return True
		for grupo in proyecto.grupos.all():
			if grupo.creador.id == user.id:
				return True
			for miembro in grupo.miembros.all():
				if miembro.id == user.id:
					return True
	return False

def addToList(lista, elem):
	yaEsta = False
	for tmp in lista:
		if tmp.id == elem.id:
			yaEsta = True
			break
	if not yaEsta:
		lista.append(elem)

def inicio(request):
	proyectos = []

	if request.user and request.user.id > 0:
		todosProyectos = Proyecto.objects.all()
		gruposPertenece = Grupo.objects.filter(miembros__id__exact=request.user.id)
		for p in todosProyectos:
			if p.creador.id == request.user.id:
				addToList(proyectos, p)
			else:
				for g in p.grupos.all():
					for tmpGrupo in gruposPertenece:
						if tmpGrupo.id == g.id:
							addToList(proyectos, p)

	return render_to_response(
		'proyectos/list.html',
		{
			'proyectos': proyectos,
			'count': proyectos.count,
			'usuario': request.user
		},
		context_instance=RequestContext(request)
	)

@login_required
def crear(request):
	if request.method == 'GET':
		return render_to_response(
			'proyectos/crear.html',
			{'form': ProyectoForm(user=request.user), 'usuario': request.user},
			context_instance=RequestContext(request)
		)
	elif request.method == 'POST':
		form = ProyectoForm(user=request.user, data=request.POST, files=request.FILES)
		if form.is_valid():
			proyecto = form.save()
			return redirect('/proyectos/editar/' + str(proyecto.id))
	return redirect('/proyectos/')

@login_required
def editarLinks(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'GET':
			return render_to_response(
				'proyectos/editarLinks.html',
				{'proyecto': proyecto,
				 'usuario': request.user,
				 'formNuevoLink': LinkForm(initial = {"url": "http://"}),
				 'formLinks': ProyectoLinksOnlyForm(proyecto.id, instance=proyecto)},
				context_instance=RequestContext(request)
			)
		elif request.method == 'POST':
			form = ProyectoLinksOnlyForm(proyecto.id, data=request.POST, files=request.FILES, instance=proyecto)
			if form.is_valid():
				proyecto = form.save()
				return redirect('/proyectos/editarLinks/' + str(proyecto.id))
	return redirect('/proyectos/')

@login_required
def editarDocumentos(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'GET':
			return render_to_response(
				'proyectos/editarDocumentos.html',
				{'proyecto': proyecto,
				 'usuario': request.user,
				 'formNuevoDoc': DocumentoForm(),
				 'formDocs': ProyectoDocsOnlyForm(proyecto.id, instance=proyecto)},
				context_instance=RequestContext(request)
			)
		elif request.method == 'POST':
			form = ProyectoDocsOnlyForm(proyecto.id, data=request.POST, files=request.FILES, instance=proyecto)
			if form.is_valid():
				proyecto = form.save()
				return redirect('/proyectos/editarDocumentos/' + str(proyecto.id))
	return redirect('/proyectos/')

@login_required
def editar(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'GET':
			return render_to_response(
				'proyectos/editar.html',
				{'form': ProyectoForm(user=request.user, instance=proyecto), 'proyecto': proyecto,
				 'usuario': request.user},
				context_instance=RequestContext(request)
			)
		elif request.method == 'POST':
			form = ProyectoForm(user=request.user, data=request.POST, files=request.FILES, instance=proyecto)
			if form.is_valid():
				form.save()
			return redirect('/proyectos/')
		else:
			return HttpResponseNotFound("Direccion no valida.")
	return redirect('/proyectos/')

@login_required
def borrar(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'POST':
			Proyecto.delete(proyecto)
			return redirect('/proyectos/')
	return redirect('/proyectos/')

@login_required
def agregarLink(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'POST':
			form = LinkForm(data=request.POST)
			if form.is_valid():
				link = form.save()
				proyecto.links.add(link)
				return redirect('/proyectos/editarLinks/' + str(proyecto.id))
	return redirect('/proyectos/')

@login_required
def borrarLink(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'POST':
			for idlink in request.POST.getlist('links'):
				try:
					link = Link.objects.get(id=idlink)
					proyecto.links.remove(link)
					Link.delete(link)
				except ObjectDoesNotExist:
					pass
			return redirect('/proyectos/editarLinks/' + str(proyecto.id))
	return redirect('/proyectos/')

@login_required
def agregarDocumento(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'POST':
			form = DocumentoForm(data=request.POST, files=request.FILES)
			if form.is_valid():
				doc = form.save()
				proyecto.documentos.add(doc)
				return redirect('/proyectos/editarDocumentos/' + str(proyecto.id))
			else:
				return render_to_response(
					'proyectos/error.html',
					{'msg': form.errors,
					 'redirect': '/proyectos/editarDocumentos/%d' % proyecto.id,
					 'usuario': request.user},
					context_instance=RequestContext(request)
				)
	return redirect('/proyectos/')

@login_required
def borrarDocumento(request, idproyecto):
	try:
		proyecto = Proyecto.objects.get(id=idproyecto)
	except ObjectDoesNotExist:
		return redirect('/proyectos/')

	if tienePermProyecto(request.user, proyecto):
		if request.method == 'POST':
			for iddoc in request.POST.getlist('documentos'):
				try:
					doc = Documento.objects.get(id=iddoc)
					proyecto.documentos.remove(doc)
					Documento.delete(doc)
				except ObjectDoesNotExist:
					pass
			return redirect('/proyectos/editarDocumentos/' + str(proyecto.id))
	return redirect('/proyectos/')
